package com.pe.pgn.clubpgn.webapp.controller.lineacredito;

import java.math.BigDecimal;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.support.SessionStatus;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.domain.ClpbClienteEmpresa;
import com.pe.pgn.clubpgn.domain.ClpdLineaCredito;
import com.pe.pgn.clubpgn.domain.beans.BNClienteEmpresa;
import com.pe.pgn.clubpgn.domain.beans.BNClienteEmpresaBusqueda;
import com.pe.pgn.clubpgn.service.ClienteEmpresaService;
import com.pe.pgn.clubpgn.webapp.controller.BaseFormController;
import com.pe.pgn.clubpgn.webapp.util.CalendarUtil;

@Controller
@RequestMapping("/lineacredito/**")
public class LineaCreditoController extends BaseFormController{

	@Autowired
	private ClienteEmpresaService clienteEmpresaService;
	
	@RequestMapping("/lineacreditolist.html")
	public void listarEmpresas(@ModelAttribute("clientebusqueda")BNClienteEmpresaBusqueda clientebusqueda,
			@RequestParam(value = "search", required = false) String search, Model model) {
		
		if(search != null && StringUtils.isNotBlank(search)){
			List<BNClienteEmpresa> empresas = clienteEmpresaService.busquedaClientesPorFiltros(clientebusqueda.getDeNombreEmpresa(), clientebusqueda.getDeRuc(), clientebusqueda.getLineaCreditoMinima(), clientebusqueda.getLineaCreditoMaxima(), clientebusqueda.getTipoLineaCredito(), clientebusqueda.getStHabilitado());								
			model.addAttribute("empresas",empresas);
			model.addAttribute("clientebusqueda", clientebusqueda);
		}
		else{
			List<BNClienteEmpresa> empresas = clienteEmpresaService.obtenerClienteEmpresas(Boolean.TRUE);
			model.addAttribute("clientebusqueda", new BNClienteEmpresaBusqueda());        
			model.addAttribute("empresas", empresas);
		}
	}
	
	@RequestMapping(value = "/lineacreditoform.html", method = RequestMethod.GET)
	public @ModelAttribute("clienteempresa") BNClienteEmpresa verClienteEmpresa(
		@RequestParam(value = "id", required = false) Long id, 
		HttpServletRequest request, ModelMap modelMap){
		
		if (id != null) {
			BNClienteEmpresa clienteEmpresa = clienteEmpresaService.obtenerClienteEmpresa(id,null);
			return clienteEmpresa;
		}
			
		BNClienteEmpresa clienteEmpresa = new BNClienteEmpresa();
		ClpdLineaCredito lineaCredito = new ClpdLineaCredito();
		lineaCredito.setVaSaldoLineaCredito(BigDecimal.ZERO);
		clienteEmpresa.setLineaCredito(lineaCredito);
		clienteEmpresa.setStClienteEmpresa(Boolean.TRUE);
		return clienteEmpresa;
	}
	
	@RequestMapping(value = "/lineacreditoform.html", method = RequestMethod.POST)
	public String guardarClienteEmpresa(@ModelAttribute("clienteempresa") BNClienteEmpresa bnclienteempresa,
			BindingResult result, SessionStatus status, HttpServletRequest request) {

		try {
			if (result.hasErrors()) {
				List<ObjectError> listError = result.getAllErrors();
				FieldError error = (FieldError)listError.get(0);
				saveError(request, error.getDefaultMessage());
				
				if(bnclienteempresa.getId() == null){
					return "redirect:lineacreditoform.html";
				}else{
					return "redirect:lineacreditoform.html?id="+bnclienteempresa.getId();
				}			
			}
			
			ClpbClienteEmpresa clienteEmpresa = new ClpbClienteEmpresa();			
	        BeanUtils.copyProperties(bnclienteempresa, clienteEmpresa);
	        
        	if("".equals(bnclienteempresa.getCoTipoLineaCredito())){
        		saveError(request, getText("clienteempresaform.error.tipolinea", request.getLocale()));
        		if(bnclienteempresa.getId() == null){
					return "redirect:lineacreditoform.html";
				}else{
					return "redirect:lineacreditoform.html?id="+bnclienteempresa.getId();
				}
        	}		        
	         
        	ClpdLineaCredito linea = new ClpdLineaCredito();
        	if (clienteEmpresa.getId() == null){
        		linea.setVaSaldoLineaCredito(bnclienteempresa.getLineaCredito().getVaLineaCredito());
        	}else{
        		
        		BNClienteEmpresa beanClienteEmpresa = clienteEmpresaService.
        		obtenerClienteEmpresa(clienteEmpresa.getId(),null);
        		
        		BigDecimal vaDiferencia 	 = BigDecimal.ZERO;
        		BigDecimal vaLineaInicial    = beanClienteEmpresa.getLineaCredito().getVaLineaCredito();
        		BigDecimal vaLineaModificada = bnclienteempresa.getLineaCredito().getVaLineaCredito();
        		BigDecimal vaSaldoModificado = bnclienteempresa.getLineaCredito().getVaSaldoLineaCredito();
        		
        		if(vaLineaInicial == null){
        			linea.setVaSaldoLineaCredito(vaLineaModificada);
        		}else{
        			//frk: si vaDiferencia es negativo quiere decir que aumentaron la Linea de Credito
            		vaDiferencia = vaLineaInicial.add(vaLineaModificada.negate());
            		vaSaldoModificado = vaSaldoModificado.add(vaDiferencia.negate());
            		linea.setVaSaldoLineaCredito(vaSaldoModificado);
        		}      		
        	}
        	
        	linea.setCoTipoLineaCredito(bnclienteempresa.getLineaCredito().getCoTipoLineaCredito());
        	linea.setVaLineaCredito(bnclienteempresa.getLineaCredito().getVaLineaCredito());
        	linea.setDaFechaInicioContrato(CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, bnclienteempresa.getLineaCredito().getFechaInicioContrato()));
        	linea.setDaFechaFinContrato(CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, bnclienteempresa.getLineaCredito().getFechaFinContrato()));
        	clienteEmpresa.setClpdLineaCredito(linea);         	
        	
	        clienteEmpresaService.guardarClienteEmpresaPorLineaCredito(clienteEmpresa);
	        clienteEmpresaService.verificarTopes(clienteEmpresa);
	        
			saveMessage(request, getText("clienteempresaform.added", 
			bnclienteempresa.getDeClienteEmpresa(),request.getLocale()));
			
			return "redirect:lineacreditolist.html";
			
		} catch (Exception e) {
			saveError(request, getText("errors.general", request.getLocale()));
			if(bnclienteempresa.getId() == null){
				return "redirect:lineacreditoform.html";
			}else{
				return "redirect:lineacreditoform.html?id="+bnclienteempresa.getId();
			}
		}
	}
}
